﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MDF.Utilites.Helper
{
    /// <summary>
    /// Lớp tiện ích xử lí ngày tháng
    /// mrDuc
    /// </summary>
    public class DateHelper
    {
       
        public string DistanceOfTime(DateTime _dtDate1, DateTime _dtDate2)
        {
            //Tính số ngày còn lại
            DateHelper dtHelper = new DateHelper();
            long iHours = dtHelper.DateDiff(DateHelper.DateInterval.Hour, DateTime.Now, _dtDate2);
            int d = 0, h = 0, m = 0;
            if (iHours > 24)
                d = (int)iHours / 24;
            h = (int)iHours - d * 24;
            if (h < 0)
                return "Đã đóng";
            if (d == 0)
                return string.Format("{0} ngày", h);
            else
                return string.Format("{0} ngày, {1} giờ", d, h);
            
        }
        /// <summary>
        /// Hàm kiểm tra năm nhuận
        /// </summary>
        /// <param name="_iNam">Năm cần kiểm tra</param>
        /// <returns>Đúng sai</returns>
        public bool IsNamNhuan(int _iNam)
        {
            if (_iNam % 4 == 0 && _iNam % 100 != 0)
                return true;
            if (_iNam % 400 == 0)
                return true;
            return false;
        }
        /// <summary>
        /// Hàm lấy số ngày trong tháng
        /// </summary>
        /// <param name="_iThang">Tháng</param>
        /// <param name="_iNam">Năm</param>
        /// <returns>Số ngày trong tháng</returns>
        public int SoNgayTrongThang(int _iThang, int _iNam)
        {
            if (_iThang == 2)
            {
                if (IsNamNhuan(_iNam))
                    return 29;
                return 28;
            }
            if (_iThang < 8)
            {
                if (_iThang % 2 == 1)
                    return 31;
                return 30;
            }
            if (_iThang % 2 == 0)
                return 31;
            return 30;
        }

        public enum DateInterval
        {
            Day,
            DayOfYear,
            Hour,
            Minute,
            Month,
            Quarter,
            Second,
            Weekday,
            WeekOfYear,
            Year
        }


        public  long DateDiff(DateInterval interval, DateTime dt1, DateTime dt2)
        {
            return DateDiff(interval, dt1, dt2, System.Globalization.DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek);
        }

        private  int GetQuarter(int nMonth)
        {
            if (nMonth <= 3)
                return 1;
            if (nMonth <= 6)
                return 2;
            if (nMonth <= 9)
                return 3;
            return 4;
        }

        public  long DateDiff(DateInterval interval, DateTime dt1, DateTime dt2, DayOfWeek eFirstDayOfWeek)
        {
            if (interval == DateInterval.Year)
                return dt2.Year - dt1.Year;

            if (interval == DateInterval.Month)
                return (dt2.Month - dt1.Month) + (12 * (dt2.Year - dt1.Year));

            TimeSpan ts = dt2 - dt1;

            if (interval == DateInterval.Day || interval == DateInterval.DayOfYear)
                return Round(ts.TotalDays);

            if (interval == DateInterval.Hour)
                return Round(ts.TotalHours);

            if (interval == DateInterval.Minute)
                return Round(ts.TotalMinutes);

            if (interval == DateInterval.Second)
                return Round(ts.TotalSeconds);

            if (interval == DateInterval.Weekday)
            {
                return Round(ts.TotalDays / 7.0);
            }

            if (interval == DateInterval.WeekOfYear)
            {
                while (dt2.DayOfWeek != eFirstDayOfWeek)
                    dt2 = dt2.AddDays(-1);
                while (dt1.DayOfWeek != eFirstDayOfWeek)
                    dt1 = dt1.AddDays(-1);
                ts = dt2 - dt1;
                return Round(ts.TotalDays / 7.0);
            }

            if (interval == DateInterval.Quarter)
            {
                double d1Quarter = GetQuarter(dt1.Month);
                double d2Quarter = GetQuarter(dt2.Month);
                double d1 = d2Quarter - d1Quarter;
                double d2 = (4 * (dt2.Year - dt1.Year));
                return Round(d1 + d2);
            }
            return 0;
        }

        private long Round(double dVal)
        {
            if (dVal >= 0)
                return (long)Math.Floor(dVal);
            return (long)Math.Ceiling(dVal);
        }
    }

}